package bookshare;
import java.sql.*;
import java.util.ArrayList;

/**
 *
 * @author Kathi, Paul & Michal
 */
public class SQLabfrage {
    
    /**
     * überprüft in der Datenbank, ob die eingegebenen Daten (Matrnr, Passwd) übereinstimmen
     * @param uMatrnr die Matrikelnummer, die im Browser eingegeben wurde
     * @param uPasswd das Passwort, das eingegeben wurde
     * @return true, wenn die eingegebenen Daten übereinstimmmen
     * @throws ClassNotFoundException
     * @throws SQLException
     * @throws InstantiationException
     * @throws IllegalAccessException 
     */
    public int proveData(String uMatrnr, String uPasswd) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
        SQLquery query = new SQLquery();
        String stmt = "SELECT * FROM user WHERE matrikelnummer="+uMatrnr+";";
        ResultSet rs = query.selectQuery(stmt);

        rs.next();
        int id = rs.getInt("id");
        String passwort = rs.getString("passwort");
        
        if(uPasswd != null && uPasswd.equals(passwort)) {
            return id;
        }
        else {
            return 0;
        }
    }
    /**
     * gibt ein entsprechendes User-Objekt zur uebergebenen UserID zurueck
     * @param userid
     * @return User-Objekt
     * @throws ClassNotFoundException
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws SQLException 
     */
    public User getUserProfile(int userid) throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
    	SQLquery query = new SQLquery();
        String stmt = "SELECT * FROM user WHERE id=" + userid + ";";
        ResultSet rs = query.selectQuery(stmt);
        
        rs.next();
        String matrikelnummer = rs.getString("matrikelnummer");
        String passwort = rs.getString("passwort");
        String vorname = rs.getString("vorname");
        String nachname = rs.getString("nachname");
        String email = rs.getString("email");

        User user = new User(matrikelnummer, passwort, vorname, nachname, email);
        user.setUserID(userid);
        return user;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, die ein User angeboten hat
     */
    public static ArrayList booksOfferedList(User user) {
    	ArrayList booksOffered = new ArrayList();
    	ArrayList booksArrayList = bookList();
        for(int i = 0; i < booksArrayList.size(); i++) {
        	Buch buch = (Buch)booksArrayList.get(i);
        	if ((buch.getVerkauft()!=true)&&(user.getUserID()==buch.getUserID())){
        		booksOffered.add(buch);
        	}
        }
        return booksOffered;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Skript-Objekten, die ein User angeboten hat
     */
    public static ArrayList scriptsOfferedList(User user) {
    	ArrayList scriptsOffered = new ArrayList();
    	ArrayList skriptList = skriptList();
        for(int i = 0; i < skriptList.size(); i++) {
        	Skript skript = (Skript)skriptList.get(i);
        	if ((skript.getVerkauft()!=true)&&(user.getUserID()==skript.getUserID())){
        		scriptsOffered.add(skript);
        	}
        }
        return scriptsOffered;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Software-Objekten, die ein User angeboten hat
     */
    public static ArrayList softwareOfferedList(User user) {
    	ArrayList softwareOffered = new ArrayList();
    	ArrayList softwareList = softwareList();
        for(int i = 0; i < softwareList.size(); i++) {
        	Software software = (Software)softwareList.get(i);
        	if ((software.getVerkauft()!=true)&&(user.getUserID()==software.getUserID())){
        		softwareOffered.add(software);
        	}
        }
        return softwareOffered;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, auf die ein User geboten hat
     */
    public static ArrayList booksBetList(User user) {
    	ArrayList alleArtikelid = new ArrayList();
    	ArrayList booksBet = new ArrayList();
        try {
            SQLquery query = new SQLquery();
            String stmt = "SELECT DISTINCT artikelid FROM gebote WHERE userid=" + user.getUserID() + "AND artikeltyp ='buch';";
            ResultSet rs = query.selectQuery(stmt);
            while(rs.next()) {
                int mArtikelid = rs.getInt("artikelid");
                alleArtikelid.add(mArtikelid);
            }
            for(int i = 0; i < alleArtikelid.size(); i++) {
            	int mArtikelid = (Integer)alleArtikelid.get(i);
            	ArrayList booksArrayList = bookList();
                for(int j = 0; j < booksArrayList.size(); j++) {
                	Buch buch = (Buch)booksArrayList.get(j);
                	if ((buch.getVerkauft()==false)&&(mArtikelid==buch.getID())){
                		booksBet.add(buch);
                	}
                }
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return booksBet;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Skript-Objekten, auf die ein User geboten hat
     */
    public static ArrayList skriptsBetList(User user) {
    	ArrayList alleArtikelid = new ArrayList();
    	ArrayList skriptsBet = new ArrayList();
        try {
            SQLquery query = new SQLquery();
            String stmt = "SELECT DISTINCT artikelid FROM gebote WHERE userid=" + user.getUserID() + " AND artikeltyp ='skriptum';";
            ResultSet rs = query.selectQuery(stmt);
            while(rs.next()) {
                int mArtikelid = rs.getInt("artikelid");
                alleArtikelid.add(mArtikelid);
            }
            for(int i = 0; i < alleArtikelid.size(); i++) {
            	int mArtikelid = (Integer)alleArtikelid.get(i);
            	ArrayList skriptArrayList = skriptList();
                for(int j = 0; j < skriptArrayList.size(); j++) {
                	Skript skript = (Skript)skriptArrayList.get(j);
                	if ((skript.getVerkauft()==false)&&(mArtikelid==skript.getID())){
                		skriptsBet.add(skript);
                	}
                }
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return skriptsBet;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Skript-Objekten, auf die ein User geboten hat
     */
    public static ArrayList softwareBetList(User user) {
    	ArrayList alleArtikelid = new ArrayList();
    	ArrayList softwareBet = new ArrayList();
        try {
            SQLquery query = new SQLquery();
            String stmt = "SELECT DISTINCT artikelid FROM gebote WHERE userid=" + user.getUserID() + " AND artikeltyp='software';";
            ResultSet rs = query.selectQuery(stmt);
            while(rs.next()) {
                int mArtikelid = rs.getInt("artikelid");
                alleArtikelid.add(mArtikelid);
            }
            for(int i = 0; i < alleArtikelid.size(); i++) {
            	int mArtikelid = (Integer)alleArtikelid.get(i);
            	ArrayList softwareArrayList = skriptList();
                for(int j = 0; j < softwareArrayList.size(); j++) {
                	Software software = (Software)softwareArrayList.get(j);
                	if ((software.getVerkauft()==false)&&(mArtikelid==software.getID())){
                		softwareBet.add(software);
                	}
                }
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return softwareBet;
    }
    
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, die ein User verkauft hat
     */
    public static ArrayList booksSold(User user) {
    	ArrayList booksSold = new ArrayList();
    	ArrayList booksArrayList = bookList();
        for(int i = 0; i < booksArrayList.size(); i++) {
        	Buch buch = (Buch)booksArrayList.get(i);
        	if (buch.getVerkauft()==true){
        		if(user.getUserID()==buch.getUserID()){
        			booksSold.add(buch);
        		}
        	}
        }
        return booksSold;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Skript-Objekten, die ein User verkauft hat
     */
    public static ArrayList scriptsSold(User user) {
    	ArrayList scriptsSold = new ArrayList();
    	ArrayList skriptsArrayList = skriptList();
        for(int i = 0; i < skriptsArrayList.size(); i++) {
        	Skript skript = (Skript)skriptsArrayList.get(i);
        	if (skript.getVerkauft()==true){
        		if(user.getUserID()==skript.getUserID()){
        			scriptsSold.add(skript);
        		}
        	}
        }
        return scriptsSold;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Skript-Objekten, die ein User verkauft hat
     */
    public static ArrayList softwareSold(User user) {
    	ArrayList softwareSold = new ArrayList();
    	ArrayList softwareArrayList = softwareList();
        for(int i = 0; i < softwareArrayList.size(); i++) {
        	Software software = (Software)softwareArrayList.get(i);
        	if (software.getVerkauft()==true){
        		if(user.getUserID()==software.getUserID()){
        			softwareSold.add(software);
        		}
        	}
        }
        return softwareSold;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, die ein User gekauft hat
     */
    public static ArrayList booksBought(User user) {
    	ArrayList booksBought = new ArrayList();
    	ArrayList booksArrayList = bookList();
        for(int i = 0; i < booksArrayList.size(); i++) {
        	Auktion auktion = new Auktion();
        	Buch buch = (Buch)booksArrayList.get(i);
        	if ((buch.getVerkauft() == true)){
                    float hoechstgebot = auktion.getHoechstgebot(buch);
                    SQLabfrage abfrage = new SQLabfrage();
                    User hoechstbietender = abfrage.getHoechstbietender(buch, hoechstgebot);
                    if(hoechstbietender != null) {
                        if (user.getUserID()==hoechstbietender.getUserID()){
                                booksBought.add(buch);
                        }
                    }
        	}
        }
        return booksBought;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, die ein User gekauft hat
     */
    public static ArrayList scriptsBought(User user) {
    	ArrayList scriptsBought = new ArrayList();
    	ArrayList skriptArrayList = skriptList();
        for(int i = 0; i < skriptArrayList.size(); i++) {
        	Auktion auktion = new Auktion();
        	Skript skript = (Skript)skriptArrayList.get(i);
        	if ((skript.getVerkauft() == true)){
                    float hoechstgebot = auktion.getHoechstgebot(skript);
                    SQLabfrage abfrage = new SQLabfrage();
                    User hoechstbietender = abfrage.getHoechstbietender(skript, hoechstgebot);
                    if(hoechstbietender != null) {
                        if (user.getUserID()==hoechstbietender.getUserID()){
                                scriptsBought.add(skript);
                        }
                    }
        	}
        }
        return scriptsBought;
    }
    /**
     * 
     * @param user
     * @return eine ArrayList mit allen Buch-Objekten, die ein User gekauft hat
     */
    public static ArrayList softwareBought(User user) {
    	ArrayList softwareBought = new ArrayList();
    	ArrayList softwareArrayList = softwareList();
        for(int i = 0; i < softwareArrayList.size(); i++) {
        	Auktion auktion = new Auktion();
        	Software software = (Software)softwareArrayList.get(i);
        	if ((software.getVerkauft() == true)){
                    float hoechstgebot = auktion.getHoechstgebot(software);
                    SQLabfrage abfrage = new SQLabfrage();
                    User hoechstbietender = abfrage.getHoechstbietender(software, hoechstgebot);
                    if(hoechstbietender != null) {
                        if (user.getUserID()==hoechstbietender.getUserID()){
                                softwareBought.add(software);
                        }
                    }
        	}
        }
        return softwareBought;
    }
    /**
     * Traegt eine Bewertung in die Datenbank ein.
     * @param bewertung Wert zwischen 1 und 5 (Schulnotensystem)
     * @param werWirdBewertet Kaeufer bewertet Verkaeufer oder umgekehrt
     * @param artikelid zu welchem Artikel wird die Bewertung abgegeben
     * @param artikelart Artikeltyp
     * @throws SQLException
     * @throws ClassNotFoundException
     * @throws InstantiationException
     * @throws IllegalAccessException 
     */
    public void setBewertung(int bewertung, String werWirdBewertet, int artikelid, String artikelart) throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException{
    	SQLquery query = new SQLquery();
        String stmt = "UPDATE bewertung SET " + werWirdBewertet + " = "+bewertung+" WHERE artikelid=" + artikelid + " AND artikelart = '"+artikelart+"';";
        query.executeUpdate(stmt);
    }
    /**
     * Welche Bewertungen hat ein Benutzer bekommen
     * @param user
     * @return Durchschnittsbewertung des Users
     * @throws ClassNotFoundException
     * @throws SQLException
     * @throws InstantiationException
     * @throws IllegalAccessException 
     */
    public float getBewertung(User user) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
        SQLquery query = new SQLquery();
        ArrayList bewertungen = new ArrayList();
        
        String stmt = "SELECT sellerbewertungbuyer FROM bewertung WHERE buyerid = "+user.getUserID()+";";
        System.out.println(stmt);
        ResultSet rs = query.selectQuery(stmt);
        while(rs.next()) {
            int bewertung = rs.getInt("sellerbewertungbuyer");
            bewertungen.add(bewertung);
        }
        
        String stmt1 = "SELECT buyerbewertungseller FROM bewertung WHERE sellerid = "+user.getUserID()+";";
        System.out.println(stmt1);
        ResultSet rs1 = query.selectQuery(stmt1);
        while(rs1.next()) {
            int bewertung = rs1.getInt("buyerbewertungseller");
            bewertungen.add(bewertung);
        }
        
        float durchschnitt = 0;
        if(!bewertungen.isEmpty()) {
            for(int i = 0; i < bewertungen.size(); i++) {
                durchschnitt = durchschnitt + (Integer)bewertungen.get(i);
            }
        }
        //float durchschnitt1 = (Float)Math.round(durchschnitt*10)/10.0;
        return durchschnitt;
    }
    /**
     * gibt alle Buecher zurueck, die in der Datenbank gespeichert sind
     * @return eine ArrayList mit allen Buch-Objekten
     */
    public static ArrayList bookList() {
        ArrayList books = new ArrayList();
        try {
            SQLquery query = new SQLquery();
            String stmt = "SELECT * FROM buch";
            ResultSet rs = query.selectQuery(stmt);
        
            while(rs.next()) {
                int buchid = rs.getInt("id");
                String name = rs.getString("name");
                float startpreis = rs.getFloat("startpreis");
                int erscheinungsjahr = rs.getInt("erscheinungsjahr");
                String beschreibung = rs.getString("beschreibung");
                String autor = rs.getString("autor");
                String verlag = rs.getString("verlag");
                String isbn = rs.getString("isbn");
                int seitenanzahl = rs.getInt("seitenanzahl");
                int userid = rs.getInt("userid");
                Boolean verkauft = rs.getBoolean("verkauft");

                Buch buch = new Buch(name, startpreis, erscheinungsjahr,beschreibung, autor, verlag, isbn, seitenanzahl, userid, verkauft);
                buch.setID(buchid);
                books.add(buch);
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return books;
    }
    /**
     * gibt alle Skripte zurueck, die in der Datenbank gespeichert sind
     * @return eine ArrayList mit allen Skript-Objekten
     */
    public static ArrayList skriptList() {
        ArrayList scripts = new ArrayList();
        try {
        	SQLquery query = new SQLquery();
        	String stmt = "SELECT * FROM skriptum";
        	ResultSet rs = query.selectQuery(stmt);
        
        	while(rs.next()) {
        		int id = rs.getInt("id");
        		String name = rs.getString("name");
        		float startpreis = rs.getFloat("startpreis");
            	int erscheinungsjahr = rs.getInt("erscheinungsjahr");
            	String beschreibung = rs.getString("beschreibung");
            	String autor = rs.getString("autor");
            	String fachbereich = rs.getString("fachbereich");
            	int userid = rs.getInt("userid");
                Boolean verkauft = rs.getBoolean("verkauft");
            
            	Skript skript = new Skript(name, startpreis, erscheinungsjahr, beschreibung, autor, fachbereich, userid, verkauft);
            	skript.setID(id);
            	scripts.add(skript);
        	}
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return scripts;
    }
    /**
     * gibt alle Software-Objekte zurueck, die in der Datenbank gespeichert sind
     * @return eine ArrayList mit allen Software-Objekten
     */
    public static ArrayList softwareList() {
        ArrayList softwarelist = new ArrayList();
        try {
        	SQLquery query = new SQLquery();
        	String stmt = "SELECT * FROM software";
        	ResultSet rs = query.selectQuery(stmt);
        
        	while(rs.next()) {
            	int id = rs.getInt("id");
            	String name = rs.getString("name");
            	float startpreis = rs.getFloat("startpreis");
            	int erscheinungsjahr = rs.getInt("erscheinungsjahr");
            	String beschreibung = rs.getString("beschreibung");
            	String entwickler = rs.getString("entwickler");
            	String medium = rs.getString("medium");
            	int userid = rs.getInt("userid");
                Boolean verkauft = rs.getBoolean("verkauft");
            
            	Software software = new Software(name, startpreis, erscheinungsjahr, beschreibung, entwickler, medium, userid, verkauft);
            	software.setID(id);
            	softwarelist.add(software);
        	}
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return softwarelist;
    }
    /**
     * Gibt eine Liste mit den Geboten zu einem bestimmen Artikel zurück.
     * @param id ArtikelID
     * @param artikeltyp Buch, Skript oder Software
     * @return eine Liste mit den Geboten (float)
     */
    public ArrayList gebote(Artikel a) {
        ArrayList gebote = new ArrayList();
        String artikeltyp;
        if(a instanceof Buch) {
            artikeltyp = "buch";
        }
        else if(a instanceof Skript) {
            artikeltyp = "skriptum";
        }
        else {
            artikeltyp = "software";
        }
        String stmt = "SELECT hoehe FROM gebote WHERE artikelid = "+a.getID()+" AND artikeltyp = '"+artikeltyp+"';";
        System.out.println(stmt);
        try {
            SQLquery query = new SQLquery();
            ResultSet rs = query.selectQuery(stmt);
            
            while(rs.next()) {
                float hoehe = rs.getFloat("hoehe");
                gebote.add(hoehe);
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return gebote;
    }
    
    public User getHoechstbietender(Artikel a, float hgebot) {
        int userid = 0;
        String artikeltyp;
        if(a instanceof Buch) {
            artikeltyp = "buch";
        }
        else if(a instanceof Skript) {
            artikeltyp = "skriptum";
        }
        else {
            artikeltyp = "software";
        }
        String stmt = "SELECT userid FROM gebote WHERE artikelid = "+a.getID()+" AND artikeltyp = '"+artikeltyp+"' AND hoehe = "+hgebot+";";
        System.out.println(stmt);
        try {
            SQLquery query = new SQLquery();
            ResultSet rs = query.selectQuery(stmt);
            if(rs.next()) {
                userid = rs.getInt("userid");
            }
            System.out.println(userid);
        } catch (Exception e) {}
        
        stmt = "SELECT * FROM user WHERE id = "+userid+";";
        try {
            SQLquery query= new SQLquery();
            ResultSet rs = query.selectQuery(stmt);
            rs.next();
            
           String matrikelnummer = rs.getString("matrikelnummer");
           String passwort = rs.getString("passwort");
           String vorname = rs.getString("vorname");
           String nachname = rs.getString("nachname");
           String email = rs.getString("email");
           
           User user = new User(matrikelnummer, passwort, vorname, nachname, email);
           user.setUserID(userid);
           return user;
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return null;
    }
    /**
     * gibt den entsprechenden Artikel zur übergebenen ArtikelID + Artikeltyp zurück.
     * @param artikelid
     * @param artikeltyp
     * @return der entsprechende Artikel oder null, wenn es diesen Artikel nicht gibt
     */
    public Artikel getArtikel(int artikelid, String artikeltyp) {
        String stmt;
        if(artikeltyp == null)
            return null;
        if(artikeltyp.equals("buch")) {
            stmt = "SELECT * FROM buch WHERE id = "+artikelid+";";
        }
        else if(artikeltyp.equals("skriptum")) {
            stmt = "SELECT * FROM skriptum WHERE id = "+artikelid+";";
        }
        else {
            stmt = "SELECT * FROM software WHERE id = "+artikelid+";";
        }
        
        try {
            SQLquery query = new SQLquery();
            ResultSet rs = query.selectQuery(stmt);
            
            rs.next();
            String name = rs.getString("name");
            float startpreis = rs.getFloat("startpreis");
            int erscheinungsjahr = rs.getInt("erscheinungsjahr");
            String beschreibung = rs.getString("beschreibung");
            int userid = rs.getInt("userid");
            
            if(artikeltyp.equals("buch")) {
                String autor = rs.getString("autor");
                String verlag = rs.getString("verlag");
                String ISBN = rs.getString("isbn");
                int seitenanzahl = rs.getInt("seitenanzahl");
                Boolean verkauft = rs.getBoolean("verkauft");
                Buch buch = new Buch(name, startpreis, erscheinungsjahr, beschreibung, autor, verlag, ISBN, seitenanzahl, userid, verkauft);
                System.out.println("buch returnt");
                return (Artikel)buch;
            }
            if(artikeltyp.equals("skriptum")) {
                String autor = rs.getString("autor");
                String fachbereich = rs.getString("fachbereich");
                Boolean verkauft = rs.getBoolean("verkauft");
                Skript skript = new Skript(name, startpreis, erscheinungsjahr, beschreibung, autor, fachbereich, userid, verkauft);
                return (Artikel)skript;
            }
            else {
                String entwickler = rs.getString("entwickler");
                String medium = rs.getString("medium");
                Boolean verkauft = rs.getBoolean("verkauft");
                Software software = new Software(name, startpreis, erscheinungsjahr, beschreibung, entwickler, medium, userid, verkauft);
                return (Artikel)software;
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
        return null;
    }
    
    public static ArrayList sucheBuchName(String artikelName) {
    	ArrayList BuecherNameSuche = new ArrayList();

    	ArrayList booksArrayList = bookList();
        for(int i = 0; i < booksArrayList.size(); i++) {
        	Buch buch = (Buch)booksArrayList.get(i);
			String buchName = buch.getName();
			buchName = buchName.toLowerCase();
        	if (buchName.contains(artikelName)){
        		BuecherNameSuche.add(buch);
        	}
        }
        return BuecherNameSuche;
    }
    
    public static ArrayList sucheSkriptName(String artikelName) {
    	ArrayList SkripteNameSuche = new ArrayList();

    	ArrayList skriptArrayList = skriptList();
        for(int i = 0; i < skriptArrayList.size(); i++) {
        	Skript skript = (Skript)skriptArrayList.get(i);
			String skriptName = skript.getName();
			skriptName = skriptName.toLowerCase();
        	if (skriptName.contains(artikelName)){
        		SkripteNameSuche.add(skript);
        	}
        }
        return SkripteNameSuche;
    }
    
    public static ArrayList sucheSoftwareName(String artikelName) {
    	ArrayList SoftwareNameSuche = new ArrayList();

    	ArrayList softwareArrayList = softwareList();
        for(int i = 0; i < softwareArrayList.size(); i++) {
        	Software software = (Software)softwareArrayList.get(i);
			String softwareName = software.getName();
			softwareName = softwareName.toLowerCase();
        	if (softwareName.contains(artikelName)){
        		SoftwareNameSuche.add(software);
        	}
        }
        return SoftwareNameSuche;
    }
    
    public void saveBook(int userid, String name, float startpreis, int erscheinungsjahr, String beschreibung, String autor, String verlag, String isbn, int seitenanzahl) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
            SQLquery query = new SQLquery();
            float currentUnixTimestamp = System.currentTimeMillis()/1000;
            String stmt = "INSERT INTO buch (userid, name, startpreis, erscheinungsjahr, beschreibung, autor, verlag, isbn, seitenanzahl, start) VALUES ("+userid+", '"+name+"', "+startpreis+", "+erscheinungsjahr+", '"+beschreibung+"', '"+autor+"', '"+verlag+"', '"+isbn+"', "+seitenanzahl+", "+currentUnixTimestamp+");";
            query.executeUpdate(stmt);
    }

    public void saveSkript(int userid, String name, double startpreis, int erscheinungsjahr, String beschreibung, String autor, String fachbereich) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
            SQLquery query = new SQLquery();
            float currentUnixTimestamp = System.currentTimeMillis()/1000;
            String stmt = "INSERT INTO skriptum (userid, name, startpreis, erscheinungsjahr, beschreibung, autor, fachbereich, start) VALUES ("+userid+", '"+name+"', "+startpreis+", "+erscheinungsjahr+", '"+beschreibung+"', '"+autor+"', '"+fachbereich+"', "+currentUnixTimestamp+");";
            System.out.println(stmt);
            query.executeUpdate(stmt);
    }
    
    public void saveSoftware(int userid, String name, float startpreis, int erscheinungsjahr, String beschreibung, String entwickler, String medium) throws ClassNotFoundException, SQLException, InstantiationException, IllegalAccessException {
            SQLquery query = new SQLquery();
            float currentUnixTimestamp = System.currentTimeMillis()/1000;
            String stmt = "INSERT INTO software (userid, name, startpreis, erscheinungsjahr, beschreibung, entwickler, medium, start) VALUES ("+userid+", '"+name+"', "+startpreis+", "+erscheinungsjahr+", '"+beschreibung+"', '"+entwickler+"', '"+medium+"', "+currentUnixTimestamp+");";
            query.executeUpdate(stmt);
    }
    
    public void saveUser(String matrnr, String passwort, String vorname, String nachname, String email) {
            try {
                SQLquery query = new SQLquery();
                String stmt = "INSERT INTO user (matrikelnummer, passwort, vorname, nachname, email) VALUES ('"+matrnr+"', '"+passwort+"', '"+vorname+"', '"+nachname+"', '"+email+"');";
                query.executeUpdate(stmt);
            } catch (Exception e) {}
   }
    /**
     * speichert einen Artikel in die Datenbank ein
     * @param user
     * @param gebot
     */
    public void saveGebot(User user, Gebot gebot) {
        try {
            SQLquery query = new SQLquery();
            String stmt = "INSERT INTO gebote (userid, artikelid, artikeltyp, hoehe) VALUES ("+user.getUserID()+", "+gebot.getArtikelID()+", '"+gebot.getArtikeltyp()+"', "+gebot.getHoehe()+");";
            query.executeUpdate(stmt);
        } catch (Exception e) {}
    }
    /**
     * Ueberprueft, ob die Auktionsdauer eines Artikel schon ueberschritten ist.
     * Wenn ja, wird der Artikel als verkauft markiert.
     */
    public void checkAuction() {
        // Angebotsdauer = 1 Woche = 604800 Sekunden
        float angebotsdauer = 604800;
        float currentTime = System.currentTimeMillis()/1000;
        String stmt;
        try {
            stmt = "SELECT * FROM buch WHERE verkauft = 0";
            SQLquery query = new SQLquery();
            ResultSet rs = query.selectQuery(stmt);
            while(rs.next()) {
                float start = rs.getFloat("start");
                int id = rs.getInt("id");
                Artikel a = getArtikel(id, "buch");
                if((start + angebotsdauer) <= currentTime) {
                    sellArtikel(a);
                }
            }
            stmt = "SELECT * FROM skriptum WHERE verkauft = 0";
            rs = query.selectQuery(stmt);
            while(rs.next()) {
                float start = rs.getFloat("start");
                int id = rs.getInt("id");
                Artikel a = getArtikel(id, "buch");
                if((start + angebotsdauer) <= currentTime) {
                    sellArtikel(a);
                }
            }
            stmt = "SELECT * FROM software WHERE verkauft = 0";
            rs = query.selectQuery(stmt);
            while(rs.next()) {
                float start = rs.getFloat("start");
                int id = rs.getInt("id");
                Artikel a = getArtikel(id, "buch");
                if((start + angebotsdauer) <= currentTime) {
                    sellArtikel(a);
                }
            }
        } catch (Exception e) { System.out.println("Exception: "+e); }
    }
    /**
     * markiert einen Artikel, den ein User gekauft hat, als verkauft
     * @param a
     */
    public void sellArtikel(Artikel a) {
        try {
            SQLquery query = new SQLquery();
            String artikeltyp;
            if(a instanceof Buch) {
                String stmt = "UPDATE buch SET verkauft=true WHERE id=" + a.getID() + ";";
                query.executeUpdate(stmt);
                artikeltyp = "buch";
            }
            else if(a instanceof Skript) {
                String stmt = "UPDATE skriptum SET verkauft=true WHERE id=" + a.getID() + ";";
                query.executeUpdate(stmt);
                artikeltyp = "skriptum";
            }
            else {
                String stmt = "UPDATE software SET verkauft=true WHERE id=" + a.getID() + ";";
                query.executeUpdate(stmt);
                artikeltyp = "software";
            }

            Auktion auktion = new Auktion();
            float hoechstgebot = auktion.getHoechstgebot(a);
            SQLabfrage abfrage = new SQLabfrage();
            User hoechstbietender = abfrage.getHoechstbietender(a, hoechstgebot);
            // vorbereiten auf die Bewertungseintragung - Verkaeufer, Kaeufer und Artikel wird festgehalten
            String stmt2 = "INSERT INTO bewertung (buyerid, sellerid, artikelid, artikelart) VALUES ("+hoechstbietender.getUserID()+", "+a.getUserID()+", "+a.getID()+", '"+artikeltyp+"');";
            query.executeUpdate(stmt2);
        } catch (Exception e) { System.out.println("Exception: "+e); }
    }
}